/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.adsi.vista;

import com.adsi.logica.LogicaClientesLocal;
import com.adsi.logica.LogicaCuentasLocal;
import com.adsi.modelo.Clientes;
import com.adsi.modelo.Cuentas;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.password.Password;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.chart.Axis;
import org.primefaces.model.chart.AxisType;
import org.primefaces.model.chart.BarChartModel;
import org.primefaces.model.chart.BarChartSeries;
import org.primefaces.model.chart.CartesianChartModel;

/**
 *
 * @author Estudiante
 */
@ManagedBean
@RequestScoped
public class CuentaVistaV {

   @EJB
    LogicaCuentasLocal logicaCuentas;

    @EJB
    LogicaClientesLocal logicaClientes;

    private InputText txtNumeroCuenta;
    private SelectOneMenu cmbClientes;
    private ArrayList<SelectItem> itemsClientes = null;
    private InputText txtSaldoCuenta;
    private InputText txtEstadoCuenta;
    private Password txtClaveCuenta;
    private List<Cuentas> listaCuentas;
    private CommandButton btnRegistrar;
    private CommandButton btnModificar;
    private CommandButton btnEliminar;
    private CommandButton btnLimpiar;
    private Cuentas selectCuentas;

    @PostConstruct
    public void init() {
        createCombinedModel();
    }
    public CuentaVistaV() {
    }

     public InputText getTxtNumeroCuenta() {
        return txtNumeroCuenta;
    }

    public void setTxtNumeroCuenta(InputText txtNumeroCuenta) {
        this.txtNumeroCuenta = txtNumeroCuenta;
    }

    public SelectOneMenu getCmbClientes() {
        return cmbClientes;
    }

    public void setCmbClientes(SelectOneMenu cmbClientes) {
        this.cmbClientes = cmbClientes;
    }

    public ArrayList<SelectItem> getItemsClientes() {

        if (itemsClientes == null) {
            try {
                itemsClientes = new ArrayList<>();
                List<Clientes> lista = logicaClientes.consultar();
                for (int i = 0; i < lista.size(); i++) {
                    itemsClientes.add(new SelectItem(lista.get(i).getCliCedula(), lista.get(i).getCliNombre()));

                }

            } catch (Exception ex) {
                Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return itemsClientes;
    }

    public void setItemsClientes(ArrayList<SelectItem> itemsClientes) {
        this.itemsClientes = itemsClientes;
    }

    public InputText getTxtSaldoCuenta() {
        return txtSaldoCuenta;
    }

    public void setTxtSaldoCuenta(InputText txtSaldoCuenta) {
        this.txtSaldoCuenta = txtSaldoCuenta;
    }

    public InputText getTxtEstadoCuenta() {
        return txtEstadoCuenta;
    }

    public void setTxtEstadoCuenta(InputText txtEstadoCuenta) {
        this.txtEstadoCuenta = txtEstadoCuenta;
    }

    public Password getTxtClaveCuenta() {
        return txtClaveCuenta;
    }

    public void setTxtClaveCuenta(Password txtClaveCuenta) {
        this.txtClaveCuenta = txtClaveCuenta;
    }

    public List<Cuentas> getListaCuentas() {

        if (listaCuentas == null) {
            try {
                listaCuentas = logicaCuentas.consultar();
            } catch (Exception ex) {
                Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return listaCuentas;
    }

    public void setListaCuentas(List<Cuentas> listaCuentas) {
        this.listaCuentas = listaCuentas;
    }

    public CommandButton getBtnRegistrar() {
        return btnRegistrar;
    }

    public void setBtnRegistrar(CommandButton btnRegistrar) {
        this.btnRegistrar = btnRegistrar;
    }

    public CommandButton getBtnModificar() {
        return btnModificar;
    }

    public void setBtnModificar(CommandButton btnModificar) {
        this.btnModificar = btnModificar;
    }

    public CommandButton getBtnEliminar() {
        return btnEliminar;
    }

    public void setBtnEliminar(CommandButton btnEliminar) {
        this.btnEliminar = btnEliminar;
    }

    public CommandButton getBtnLimpiar() {
        return btnLimpiar;
    }

    public void setBtnLimpiar(CommandButton btnLimpiar) {
        this.btnLimpiar = btnLimpiar;
    }

    public Cuentas getSelectCuentas() {
        return selectCuentas;
    }

    public void setSelectCuentas(Cuentas selectCuentas) {
        this.selectCuentas = selectCuentas;
    }

    public void funcion_limpiar() {
        txtNumeroCuenta.setValue("");
        cmbClientes.setValue("Seleccionar");
        txtSaldoCuenta.setValue("");
        txtEstadoCuenta.setValue("");
        txtClaveCuenta.setValue("");
        txtNumeroCuenta.setDisabled(false);
        btnRegistrar.setDisabled(false);
        btnModificar.setDisabled(true);
        btnEliminar.setDisabled(true);
    }

    public void funcion_registrar() {
        try {
            Cuentas c = new Cuentas();
            String numero = txtNumeroCuenta.getValue().toString();
            c.setCueNumero(numero);
            Clientes cli = logicaClientes.consultarPorCod(Long.parseLong(cmbClientes.getValue().toString()));
            c.setCliCedula(cli);
            c.setCueSaldo(BigDecimal.valueOf(Double.parseDouble(txtSaldoCuenta.getValue().toString())));
            c.setCueActiva(txtEstadoCuenta.getValue().toString());
            c.setCueClave(txtClaveCuenta.getValue().toString());

            logicaCuentas.registrar(c);

            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_INFO, "Informacion", "La cuenta se registro con exito"));

        } catch (Exception ex) {
            Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", ex.getMessage()));

        }
        listaCuentas = null;
        funcion_limpiar();
    }

    public void funcion_modificar() {
        try {
            Cuentas c = new Cuentas();
            String numero = txtNumeroCuenta.getValue().toString();
            c.setCueNumero(numero);
            Clientes cli = logicaClientes.consultarPorCod(Long.parseLong(cmbClientes.getValue().toString()));
            c.setCliCedula(cli);
            c.setCueSaldo(BigDecimal.valueOf(Double.parseDouble(txtSaldoCuenta.getValue().toString())));
            c.setCueActiva(txtEstadoCuenta.getValue().toString());
            c.setCueClave(txtClaveCuenta.getValue().toString());

            logicaCuentas.modificar(c);

            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_INFO, "Informacion", "La cuenta se Modificó con exito"));

        } catch (Exception ex) {
            Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", ex.getMessage()));

        }
        listaCuentas = null;
        funcion_limpiar();
    }

    public void funcion_eliminar() {
        try {
            Cuentas c = new Cuentas();
            c.setCueNumero(txtNumeroCuenta.getValue().toString());
            logicaCuentas.eliminar(c);
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_INFO, "Informacion", "La cuenta se Eliminó con exito"));
        } catch (Exception ex) {
            Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", ex.getMessage()));
        }
        listaCuentas = null;
        funcion_limpiar();

    }

    public void funcion_seleccionar(SelectEvent event) {
        Cuentas cuentaSeleccionada = (Cuentas) event.getObject();
        txtNumeroCuenta.setValue(cuentaSeleccionada.getCueNumero());
        cmbClientes.setValue(cuentaSeleccionada.getCliCedula().getCliCedula());
        txtSaldoCuenta.setValue(cuentaSeleccionada.getCueSaldo());
        txtEstadoCuenta.setValue(cuentaSeleccionada.getCueActiva());
        txtNumeroCuenta.setDisabled(true);
        btnRegistrar.setDisabled(true);
        btnModificar.setDisabled(false);
        btnEliminar.setDisabled(false);
    }

    // GRAFICO COMBINED
    private CartesianChartModel combinedModel;

    public CartesianChartModel getCombinedModel() {
        return combinedModel;
    }

    public void setCombinedModel(CartesianChartModel combinedModel) {
        this.combinedModel = combinedModel;
    }

    
     private void createCombinedModel() {
        combinedModel = new BarChartModel();
 
        BarChartSeries cuentas = new BarChartSeries();
         
       
       
        combinedModel.setTitle("Saldo Cuentas");
        combinedModel.setLegendPosition("ne");
        combinedModel.setMouseoverHighlight(false);
        combinedModel.setShowDatatip(false);
        combinedModel.setShowPointLabels(true);
        Axis yAxis = combinedModel.getAxis(AxisType.Y);
        yAxis.setMin(0);
        yAxis.setMax(150000);
        
              List<Cuentas> lista = null;
        try {
            lista = logicaCuentas.consultar();
        } catch (Exception ex) {
            Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
        }
            
            
            cuentas.setLabel("Cuentas");
            for (int i = 0; i < lista.size(); i++) {

                cuentas.set(lista.get(i).getCueNumero(), lista.get(i).getCueSaldo());
            } 
            combinedModel.addSeries(cuentas);
    }

     
}
